"use strict"

let urljoin = require("url-join"),
	_ = require("lodash"),
	template = require("es6-template-strings"),
	log4js = require('log4js'),
	logger = log4js.getLogger('qywx-api'),
	debug = require('debug')('qywx-api'),
	rp = require("request-promise"),
	URLs = require('./urls.js').URLs();

let DepartmentAPI = require('./DepartmentAPI')(),
		MemberAPI = require('./MemberAPI')(),
		MediaAPI = require('./MediaAPI')(),
		TagAPI = require('./TagAPI')(),
    MaterialAPI=require('./MaterialAPI')();

module.exports = function(options) {
	return {
		getAccessToken: function(corpId, corpSecret, cb) {
			let targetUrl =
				template(URLs.GET_ACCESS_TOKEN, {
					corpId: corpId,
					corpSecret: corpSecret
				});
			debug("getAccessToken from: ", targetUrl);

			var rpOptions = {
				uri: targetUrl,
				qs: { //Query parameters
					//access_token: 'xxxxx xxxxx' -> uri + '?access_token=xxxxx%20xxxxx'
				},
				headers: {
					//'User-Agent': 'Request-Promise'
				},
				json: true // Automatically parses the JSON string in the response
			};

			rp(rpOptions).then(function(data) {
					/**
					    Parse response data
					    Success response:
					      {
					         "access_token": "accesstoken000001",
					         "expires_in": 7200
					      }
					    Error respnonse:
					      {
					        "errcode": 43003,
					        "errmsg": "require https"
					      }
					*/
					if (data.errcode > 0) {
						logger.error("request for access token error: ", data);
						return cb(new Error(data.errmsg));
					}
					return cb(null, data);
				})
				.catch(function(err) {
					logger.error("request for access token error: ", err);
					//For lock - if we failed to request new token then we must Unlock it
					//client.lockedForQuery = false;
					return cb(err);
				});
		},
		getDepartmentList: function(accessToken, departmentId, cb) {
				DepartmentAPI.getDepartmentList(accessToken, departmentId, cb);
			}
			/**
			 * POST Body
			 {
			   "name": "广州研发中心", //部门名称。长度限制为1~64个字节，字符不能包括\:*?"<>｜
			   "parentid": "1", //父亲部门id。根部门id为1
			   "order": "1", //在父部门中的次序值。order值小的排序靠前。
			   "id": "1"  //部门id，整型。指定时必须大于1，不指定时则自动生成
			 }
			 */
			,
		createDepartment: function(accessToken, name, parentId, order, id, cb) {
				DepartmentAPI.createDepartment(accessToken, name, parentId, order, id, cb);
			}
			/**
     * POST Body
     params:{
       accessToken：必须
       id :必须
       name :否
       parentId:否
       order：必须
       cb:必须
   }
    备注：请求包结构体为（如果非必须的字段未指定，则不更新该字段之前的设置值）:
     */
			,
		updateDepartment: function(accessToken, id, name, parent_Id, order, cb) {
				DepartmentAPI.updateDepartment(accessToken, id, name, parent_Id, order, cb);
			}
			/**
     * 删除部门信息
     params:{
       accessToken：必须
       id :必须
       cb:必须
   }
     */
			,
		deleteDepartment: function(accessToken, id, cb) {
				DepartmentAPI.deleteDepartment(accessToken, id, cb);
			}
			/**
		 * 创建成员
		 * Params{
			参数	      必须	      说明
			access_token	是	调用接口凭证
			userid	是	成员UserID。对应管理端的帐号，企业内必须唯一。长度为1~64个字节
			name	是	成员名称。长度为1~64个字节
			department	否	成员所属成员id列表
			position	否	职位信息。长度为0~64个字节
			mobile	否	手机号码。企业内必须唯一，mobile/weixinid/email三者不能同时为空
			gender	否	性别。1表示男性，2表示女性
			email	否	邮箱。长度为0~64个字节。企业内必须唯一
			weixinid	否	微信号。企业内必须唯一。（注意：是微信号，不是微信的名字）
			avatar_mediaid	否	成员头像的mediaid，通过多媒体接口上传图片获得的mediaid
			extattr	否	扩展属性。扩展属性需要在WEB管理端创建后才生效，否则忽略未知属性的赋值
		 * }
		 */
			,
		createMember: function(accessToken, userid, name, department, position, mobile, gender, email, weixinid, avatar_mediaid, extattr, cb) {
				MemberAPI.createMember(accessToken, userid, name, department, position, mobile, gender, email, weixinid, avatar_mediaid, extattr, cb);
			}
			/**
		 * 更新成员
		 ** Params{
			参数	      必须	      说明
			access_token	是	调用接口凭证
			userid	是	成员UserID。对应管理端的帐号，企业内必须唯一。长度为1~64个字节
			name	否	成员名称。长度为0~64个字节
			department	否	成员所属部门id列表
			position	否	职位信息。长度为0~64个字节
			mobile	否	手机号码。企业内必须唯一，mobile/weixinid/email三者不能同时为空
			gender	否	性别。1表示男性，2表示女性
			email	否	邮箱。长度为0~64个字节。企业内必须唯一
			weixinid	否	微信号。企业内必须唯一。（注意：是微信号，不是微信的名字）
			enable	否	启用/禁用成员。1表示启用成员，0表示禁用成员
			avatar_mediaid	否	成员头像的mediaid，通过多媒体接口上传图片获得的mediaid
			extattr	否	扩展属性。扩展属性需要在WEB管理端创建后才生效，否则忽略未知属性的赋值
		 * }
		 */
			,
		updateMember: function(accessToken, userid, name, department, position, mobile, gender, email, weixinid, avatar_mediaid, extattr, cb) {
				MemberAPI.updateMember(accessToken, userid, name, department, position, mobile, gender, email, weixinid, avatar_mediaid, extattr, cb)
			}
			/**
			 * 获取成员
			 * params{
			 * 	参数	必须	说明
				access_token	是	调用接口凭证
				userid	是	成员UserID。对应管理端的帐号
			 * }
			 */
			,
		getMember: function(accessToken, userid, cb) {
				MemberAPI.getMember(accessToken, userid, cb);
			}
			/**
			 * 删除成员
			 * params{
			 * 	参数	必须	说明
				access_token	是	调用接口凭证
				userid	是	成员UserID。对应管理端的帐号
			 * }
			 */
			,
		deleteMember: function(accessToken, userid, cb) {
				MemberAPI.deleteMember(accessToken, userid, cb);
			}
			/**
				 * 批量删除成员
				 * params{
				 * 	参数	必须	说明
					access_token	是	调用接口凭证
					useridlist	是	成员UserID列表。对应管理端的帐号
				 * }
				 */
			,
		batchdeleteMember: function(accessToken, useridlist, cb) {
				MemberAPI.batchdeleteMember(accessToken, useridlist, cb);
			}
			/**
	 * 获取部门成员列表
	 * params{
		参数	必须	说明
		access_token	是	调用接口凭证
		department_id	是	获取的部门id
		fetch_child	否	1/0：是否递归获取子部门下面的成员
		status	否	0获取全部成员，1获取已关注成员列表，2获取禁用成员列表，4获取未关注成员列表。status可叠加，未填写则默认为4
	 * }
	 */
			,
		getSimpleListMember: function(accessToken, department_id, fetch_child, status, cb) {
				MemberAPI.getSimpleListMember(accessToken, department_id, fetch_child, status, cb);
			}
			/**
 * 获取部门成员详情
 * params{
 参数	必须	说明
 access_token	是	调用接口凭证
 department_id	是	获取的部门id
 fetch_child	否	1/0：是否递归获取子部门下面的成员
 status	否	0获取全部成员，1获取已关注成员列表，2获取禁用成员列表，4获取未关注成员列表。status可叠加,未填写则默认为4
 * }
 */
			,
		getMemberListDetail: function(accessToken, department_id, fetch_child, status, cb) {
				MemberAPI.getMemberListDetail(accessToken, department_id, fetch_child, status, cb);
			}
			/**
			创建标签
			  params{
			      参数	必须	说明
			      access_token	是	调用接口凭证
			      tagname	是	标签名称，长度为1~64个字节，标签名不可与其他标签重名。
			      tagid	否	标签id，整型，指定此参数时新增的标签会生成对应的标签id，不指定时则以目前最大的id自增。
			  }
			*/
			,
		createTag: function(accessToken, tagname, tagid, cb) {
				TagAPI.createTag(accessToken, tagname, tagid, cb);
			}
			/**
				更新标签
				  params{
				      参数	必须	说明
				      access_token	是	调用接口凭证
				      tagname	是	标签名称，长度为1~64个字节，标签名不可与其他标签重名。
				      tagid	否	标签id，整型，指定此参数时新增的标签会生成对应的标签id，不指定时则以目前最大的id自增。
				  }
				*/
			,
		updateTag: function(accessToken, tagname, tagid, cb) {
				TagAPI.updateTag(accessToken, tagname, tagid, cb);
			}
			/**
				删除标签
					params{
					参数	必须	说明
					access_token	是	调用接口凭证
					tagid	是	标签ID
					}
				*/
			,
		deleteTag: function(accessToken, tagid, cb) {
				TagAPI.deleteTag(accessToken, tagid, cb);
			}
			/**
			获取标签列表
				params{
						参数	必须	说明
						access_token	是	调用接口凭证
				}
			*/
			,
		getTagList: function(accessToken, cb) {
				TagAPI.getTagList(accessToken, cb);
			}
			/**
					获取标签成员列表
						params{
							参数	必须	说明
							access_token	是	调用接口凭证
							tagid	是	标签ID
						}
					*/
			,
		getTagMemberList: function(accessToken, tagid, cb) {
				TagAPI.getTagMemberList(accessToken, tagid, cb);
			}
			/**
			上传临时素材
			params{
				参数	必须	说明
				access_token	是	调用接口凭证
				type	是	媒体文件类型，分别有图片（image）、语音（voice）、视频（video），普通文件(file)
				media	是	form-data中媒体文件标识，有filename、filelength、content-type等信息
			}
			*/
			,
		uploadMedia: function(accessToken, type, media, cb) {
				MediaAPI.uploadMedia(accessToken, type, media, cb);
			}
			/**
      * [get 获取临时素材]
				params{
					参数	必须	说明
					access_token	是	调用接口凭证
					media_id	是	媒体文件id
				}
      */
			,
		getMedia: function(accessToken, media_id,cb) {
			MediaAPI.getMedia(accessToken, media_id,cb);
		}
		/**
		 * 上传永久素材
		 * params{
				参数	必须	说明
				access_token	是	调用接口凭证
				agentid	是	企业应用的id，整型。可在应用的设置页面查看
				articles	是	图文消息，一个图文消息支持1到10个图文
				title	是	图文消息的标题
				thumb_media_id	是	图文消息缩略图的media_id, 可以在上传永久素材接口中获得
				author	否	图文消息的作者
				content_source_url	否	图文消息点击“阅读原文”之后的页面链接
				content	是	图文消息的内容，支持html标签
				digest	否	图文消息的描述
				show_cover_pic	否	是否显示封面，1为显示，0为不显示。默认为0
			 }
		 */
		,add_mpnews:function(accessToken, agentid, articles,title,thumb_media_id,author,content_source_url,content,digest,show_cover_pic,cb){

		}
	}
}
